/**
 * 测试libevent的事件机制，通过管道通信；
 * @author: sundx
 * @date: 2020-06-04 16:15:55
 * @Last Modified by: sundx
 * @Last Modified time: 2020-06-04 16:20:55
 */

#include <event2/event.h>
#include <fcntl.h>
#include <iostream>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
  void readFunc(int fd, short what, void *argc); //声明回调函数
  unlink("fifotest");                            //将硬连接数减去1；
  mkfifo("fifotest", 0644);                      //创建管道文件
  int readFd = open("fifotest", O_RDONLY | O_NONBLOCK); //读
  if (readFd == -1) {
    perror("read error");
    exit(EXIT_FAILURE);
  }
  event_base *base = event_base_new(); //创建base；
  event *rdEvent = //创建读管道事件，并设置回调函数（持续读）
      event_new(base, readFd, EV_READ | EV_PERSIST, readFunc, nullptr);
  event_add(rdEvent, nullptr); //挂载事件 设置事件满足就回调
  event_base_dispatch(base);   //循环监听事件满足
  event_free(rdEvent);         //释放资源；
  event_base_free(base);
  return 0;
}

void readFunc(int fd, short what, void *argc) {
  char buf[1024];
  bzero(buf, 1024);
  read(fd, buf, 1024);
  std::cout << buf << std::endl;
  sleep(1);
  return;
}